Leetcode 102.二叉树的层序遍历


题目描述:

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。

示例:

二叉树:[3,9,20,null,null,15,7],

1
2
3
4
5
  3
/ \
9 20
/ \
15 7

返回其层序遍历结果:

1
2
3
4
5
[
[3],
[9,20],
[15,7]
]

链接:

https://leetcode-cn.com/problems/binary-tree-level-order-traversal


题目分析

  我们知道,二叉树的层序遍历跟广度优先搜索的过程是一样的,所用到的数据结构都是队列。每次将队头出列,并将其左右子结点加入队尾,这样即可以按照层次的顺序得到二叉树的结果。但是阅读示例可以发现,返回的结果是二维的数组,不同层次之间需要隔开,怎么分隔呢?我们可以在每一层的开始先检查队列中的元素个数,然后按照这个数目进行循环,循环结束也即该层遍历结束。下一层的时候重复这个过程即可,直到队列为空则遍历结束。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> result;
if(!root) return result;

queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
int levelsize = q.size();
result.push_back(vector<int>());
while(levelsize--){
TreeNode *p = q.front();
q.pop();
result.back().push_back(p->val);
if(p->left) q.push(p->left);
if(p->right) q.push(p->right);
}
}
return result;
}
};

  时间复杂度:$O(n)$,其中 $n$ 为二叉树的结点数。所有结点各入队一次出队一次。
  空间复杂度:$O(n)$,其中 $n$ 为二叉树的结点数。队列的最大长度为 $n$。